package com.qf.filter;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import com.qf.pojo.Result;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

@Component
public class ZuulLoginFilter extends ZuulFilter {

    /*
        过滤器类型
          pre  -- 前置拦截
          route  -- 路由调用拦截
          error  -- 异常后拦截（异常了一定会执行，可以在这种过滤器中统一处理路由异常）
          post -- 后置拦截（其他拦截器正常执行一定会最后执行到这种类型的过滤，可以在这种过滤器中统一处理路由正常的操作）
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /*
        过滤器执行顺序，值越小，优先级越高
     */
    @Override
    public int filterOrder() {
        return -5;
    }

    /*
        是否要拦截，如果返回true，会执行到run方法中，如果返回false执行放行
            可以在这里面做一些不需要拦截的资源过滤
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() throws ZuulException {
        //内部还是ThreadLocal
        RequestContext currentContext = RequestContext.getCurrentContext();
        HttpServletRequest request = currentContext.getRequest();

        String token = request.getParameter("token");
        if (token == null || token.length() == 0){
            //不允许访问
            currentContext.setSendZuulResponse(false); //不需要在向下放了，请求到此为止
            currentContext.getResponse().setStatus(401);

            currentContext.getResponse().setContentType("text/html;charset=utf-8");

            Result result = Result.error("token参数不合法");
            String json = null;
            try {
                json = new ObjectMapper().writeValueAsString(result);
                currentContext.getResponse().getWriter().write(json);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        //这个返回值目前没有任何意义，可能后期在框架升级时会使用到
        return null;
    }
}
